package com.home.common.utils.jdbc;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.Date;

//import javax.persistence.Column;
//import javax.persistence.Table;
//import java.lang.reflect.Field;
//import java.lang.reflect.InvocationTargetException;
//import java.lang.reflect.Method;
//import java.text.DateFormat;
//import java.text.SimpleDateFormat;
//import java.time.LocalDateTime;
//import java.time.format.DateTimeFormatter;
//import java.util.ArrayList;
//import java.util.Calendar;
//import java.util.Date;
//import java.util.List;

/**
 * Description: Jdbc 工具类
 * Created by 王大宸 on 2020-09-28 20:07
 * Created with IntelliJ IDEA.
 */
public class JdbcUtils {
    private static final Logger logger = LoggerFactory.getLogger(JdbcUtils.class);

    //实例化日历
    private static final Calendar calendar = Calendar.getInstance();
    private static final String MONTH_FORMAT = "yyyy-MM";
    private static final String DATE_FORMAT = "yyyy-MM-dd";
    private static final String DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";

    /***
     * 功能说明：批量添加
     *   T中必须有Table和Column注解，主键必须名id
     * @author 王大宸
     * @date 2020/9/28 20:08
     * @param list    批量添加数据
     * @param entity  数据类型
     * @return java.lang.String
     */
//    public static <T> String batchSave(List<T> list, Class<T> entity) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
//        /** 拼接sql语句 */
//        StringBuffer sb = new StringBuffer();
//        sb.append("INSERT INTO ");
//        /** 获取类名 */
//        Class c = Class.forName(entity.getName());
//        /** 获取Table注解属性 */
//        Table table = (Table) c.getAnnotation(Table.class);
//        sb.append(table.name()).append(" (id,");
//        /** 获取方法 */
//        Field[] fields = c.getDeclaredFields();
//        List<String> methods = new ArrayList<>(fields.length);
//        methods.add("getId");
//        /** 拼接字段 */
//        for (int i = 0; i < fields.length; i++) {
//            fields[i].setAccessible(true);
//            /** 获取Column注解 */
//            Column column = fields[i].getAnnotation(Column.class);
//            if (null == column) {
//                continue;
//            }
//            sb.append(column.name()).append(i == fields.length - 1 ? ") VALUES " : ",");
//            methods.add("get" + fields[i].getName().substring(0, 1).toUpperCase() + fields[i].getName().substring(1));
//        }
//        /** 拼接值 */
//        for (int j = 0; j < list.size(); j++) {
//            T t = list.get(j);
//            sb.append("(");
//            Method method;
//            for (int i = 0; i < methods.size(); i++) {
//                /** 反射get方法 */
//                method = t.getClass().getMethod(methods.get(i), null);
//                String type = method.getAnnotatedReturnType().getType().toString();
//
//                // 如果type是类类型，则前面包含"class "，后面跟类名
//                Object object = method.invoke(t, null);
//                if (object == null) {
//                    sb.append("null").append(i == methods.size() - 1 ? ")" : ",");
//                    continue;
//                }
//                if (type.endsWith("String")) {
//                    String value = (String) object;
//                    sb.append("'").append(value).append("'").append(i == methods.size() - 1 ? ")" : ",");
//                    continue;
//                }
//                if (type.endsWith("Integer")) {
//                    Integer value = (Integer) object;
//                    sb.append("'").append(value).append("'").append(i == methods.size() - 1 ? ")" : ",");
//                    continue;
//                }
//                if (type.endsWith("Boolean")) {
//                    Boolean value = (Boolean) object;
//                    sb.append(value).append(i == methods.size() - 1 ? ")" : ",");
//                    continue;
//                }
//                if (type.endsWith("Date")) {
//                    Date value = (Date) object;
//                    sb.append("'").append(getStrByDateTime(value)).append("'").append(i == methods.size() - 1 ? ")" : ",");
//                    continue;
//                }
//                if (type.endsWith("LocalDateTime")) {
//                    LocalDateTime value = (LocalDateTime) object;
//                    sb.append("'").append(getStrByDateTime(value)).append("'").append(i == methods.size() - 1 ? ")" : ",");
//                    continue;
//                } else {
//                    sb.append("'").append(object.toString()).append("'").append(i == methods.size() - 1 ? ")" : ",");
//                }
//
//            }
//            sb.append(j == list.size() - 1 ? "" : ",");
//        }
//        return sb.toString();
//    }

    /***
     * 功能说明：返回批量更新sql语句
     *  T中必须有Table和Column注解，主键必须名id
     * @author 王大宸
     * @date 2020/9/28 20:08
     * @param list  批量修改的数据
     * @param t1    数据类型
     * @return java.lang.String
     */
//    public static <T> String getUpdateSql(List<T> list, Class<T> t1) throws Exception {
//        /** sql语句 */
//        StringBuffer sb = new StringBuffer();
//        sb.append("UPDATE ");
//        //反射类和注解 */
//        Class c = Class.forName(t1.getName());
//        Table table = (Table) c.getAnnotation(Table.class);
//        sb.append(table.name()).append(" SET ");
//        /** 字段 */
//        Field[] fields = c.getDeclaredFields();
//        /** ids */
//        List<String> ids = new ArrayList<>(list.size());
//        for (int i = 0; i < list.size(); i++) {
//            Method method = list.get(i).getClass().getMethod("getId", null);
//            String id = null == method.invoke(list.get(i), null) ? "" : method.invoke(list.get(i), null).toString();
//            ids.add(id);
//        }
//        /** 拼接set语句 */
//        for (int i = 0; i < fields.length; i++) {
//            fields[i].setAccessible(true);
//            /** 获取Column注解 */
//            Column column = fields[i].getAnnotation(Column.class);
//            if (null == column) {
//                continue;
//            }
//            sb.append(column.name()).append(" = CASE id ");
//            for (int j = 0; j < list.size(); j++) {
//                T t = list.get(j);
//                /** 反射get方法 */
//                String methodName = "get" + fields[i].getName().substring(0, 1).toUpperCase() +
//                        fields[i].getName().substring(1);
//                Method method = t.getClass().getMethod(methodName, null);
//                sb.append(" WHEN '").append(ids.get(j)).append("' THEN ");
//                String type = method.getAnnotatedReturnType().getType().toString();
//                // 如果type是类类型，则前面包含"class "，后面跟类名
//                Object object = method.invoke(t, null);
//                //如果值为空则更新为原来的值（不更新）
//                if (object == null) {
//                    sb.append(table.name()).append(".").append(column.name());
//                } else if (type.endsWith("String")) {
//                    String value = (String) object;
//                    sb.append("'").append(value).append("'");
//                } else if (type.endsWith("Integer")) {
//                    Integer value = (Integer) object;
//                    sb.append("'").append(value).append("'");
//                } else if (type.endsWith("Boolean")) {
//                    Boolean value = (Boolean) object;
//                    sb.append(value);
//                } else if (type.endsWith("Date")) {
//                    Date value = (Date) object;
//                    sb.append("'").append(getStrByDateTime(value)).append("'");
//                } else {
//                    sb.append("'").append(object.toString()).append("'");
//                }
//                sb.append(j == list.size() - 1 ? i == fields.length - 1 && j == list.size() - 1 ? " END " : " END, " : " ")
//                        .append(i == fields.length - 1 && j == list.size() - 1 ? " WHERE id IN (" : "");
//            }
//        }
//        //后置where语句
//        for (int i = 0; i < ids.size(); i++) {
//            sb.append("'").append(ids.get(i)).append("'")
//                    .append(i == ids.size() - 1 ? ")" : ",");
//        }
//        return sb.toString();
//    }

    /***
     * 功能说明： 下划线转驼峰
     *
     * @author 王大宸
     * @date 2019/7/23 19:31
     * @param inputString  带下划线的字段
     * @return java.lang.String
     */
    public static String camelMap(String inputString) {
        StringBuilder stringBuilder = new StringBuilder();
        boolean nextUpperCase = false;
        for (int i = 0; i < inputString.length(); i++) {
            char charAt = inputString.charAt(i);
            if (charAt == '_') {
                if (stringBuilder.length() > 0) {
                    nextUpperCase = true;
                }
            } else {
                if (nextUpperCase) {
                    stringBuilder.append(Character.toUpperCase(charAt));
                    nextUpperCase = false;
                } else {
                    stringBuilder.append(Character.toLowerCase(charAt));
                }
            }
        }
        return stringBuilder.toString();
    }


    /***
     * 功能说明：时间转成 String 类型
     *
     * @author 王大宸
     * @date 2019/4/11 20:21
     * @param date 时间
     * @return java.lang.String
     */
    public static String getStrByDateTime(LocalDateTime date) {
        DateTimeFormatter df = DateTimeFormatter.ofPattern(DATE_TIME_FORMAT);
        return df.format(date);
    }


    /***
     * 功能说明：时间转成 String 类型
     *
     * @author 王大宸
     * @date 2019/7/23 21:53
     * @param date
     * @return java.lang.String
     */
    public static String getStrByDateTime(Date date) {
        DateFormat df = new SimpleDateFormat(DATE_TIME_FORMAT);
        return df.format(date);
    }

}
